﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GeneralLibs;
using Lists;
using System.Linq;
using System.Data.SqlClient;

namespace BasicForms
{
    public partial class FrmGeneralSettings : BasicForms.FrmOKCancel
    {
        public FrmGeneralSettings()
        {
            InitializeComponent();
        }

        private void FrmGeneralSettings_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;
            radioButtonDuocSuaNgayHoaDon.Checked = Config.DuocPhepSuaNgayHoaDon == DuocPhepSuaNgayHoaDonHayKhong.DuocPhep;

            cmbCachTinhGiaMuaBanBuon.SelectedIndex = (int)Config.CachTinhGiaMuaBanBuon;
            cmbConfigTangSoChungTu.SelectedIndex = (int)Config.CachSinhSoChungTu;
            cmbPhuongPhapTinhGiaTonKho.SelectedIndex = (int)Config.PhuongPhapTinhGiaTonKho;

            radioButtonDuocPhepXuatHangAm.Checked = Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.DuocPhep;
            radioButtonKhongDuocPhepXuatHangAm.Checked = Config.DuocPhepXuatHangAm == DuocPhepXuatHangAmHayKhong.KhongDuocPhep;

            radioButtonDuocPhepChiTienAm.Checked = Config.DuocPhepChiTienAm == DuocPhepChiTienAmHayKhong.DuocPhep;
            radioButtonKhongDuocPhepChiTienAm.Checked = Config.DuocPhepChiTienAm == DuocPhepChiTienAmHayKhong.KhongDuocPhep;

            radioButtonDuocPhepSuaMaHangKhiDaGiaoDich.Checked = Config.DuocPhepSuaMaHangKhiDaGiaoDich == DuocPhepSuaMaHangKhiDaGiaoDichHayKhong.DuocPhep;
            radioButtonKhongDuocPhepSuaMaHangKhiDaGiaoDich.Checked = Config.DuocPhepSuaMaHangKhiDaGiaoDich == DuocPhepSuaMaHangKhiDaGiaoDichHayKhong.KhongDuocPhep;

            radioButtonDuocLuuBanLeKhiTienKhachDuaChuaDu.Checked = Config.DuocLuuHDBLKhiKhahDuaThieuTien == DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.DuocPhep;
            radioButtonKhongDuocLuuBanLeKhiTienKhachDuaChuaDu.Checked = Config.DuocLuuHDBLKhiKhahDuaThieuTien == DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.KhongDuocPhep;

            rdoAllowSearchWithNumber.Checked = Config.SuDungSearchWithNumberChoCombo == SuDungSearchWithNumberChoCombo.DuocPhep;
            rdoNotAllowSearchWithNumber.Checked = Config.SuDungSearchWithNumberChoCombo == SuDungSearchWithNumberChoCombo.KhongDuocPhep;

            numericTexBoxSuaHoaDonTrongVong.Text = Config.SoNgayDuocPhepSuaHoaDon.ToString();
            nmrNgayKhoaHoaDon.Text = Config.NgayKhoaSuaHĐThangTruoc.ToString();

            rdoDuocSuaDanhMuc.Checked = Config.DuocPhepSuaDanhMuc == DuocPhepSuaDanhMucHayKhong.DuocPhep;
            rdoKhongDuocSuaDanhMuc.Checked = Config.DuocPhepSuaDanhMuc == DuocPhepSuaDanhMucHayKhong.KhongDuocPhep;

            rdoChoPhepSuaHĐTienMat.Checked = Config.DuocSuaHĐThanhToanTienMat == DuocPhepSuaHoaDonThanhToanTienMatHayKhong.DuocPhep;
            rdoKhongChoPhepSuaHĐTienMat.Checked = Config.DuocSuaHĐThanhToanTienMat == DuocPhepSuaHoaDonThanhToanTienMatHayKhong.KhongDuocPhep;

            rdoAllowTaoHangTuBanLe.Checked = Config.DuocPhepTaoHangMoiBanLe == DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.DuocPhep;
            rdoNotAllowTaoHangTuBanLe.Checked = Config.DuocPhepTaoHangMoiBanLe == DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.KhongDuocPhep;

            txtLinkAutoUpdate.Text = Config.LinkAutoUpdate;
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            try
            {
                Config.CachTinhGiaMuaBanBuon = (CachTinhGiaMuaBanBuon)cmbCachTinhGiaMuaBanBuon.SelectedIndex;
                Config.CachSinhSoChungTu = (CachSinhSoChungTu)cmbConfigTangSoChungTu.SelectedIndex;
                Config.PhuongPhapTinhGiaTonKho = (PhuongPhapTinhGiaTonKhoEnum)cmbPhuongPhapTinhGiaTonKho.SelectedIndex;
                Config.DuocPhepXuatHangAm = radioButtonDuocPhepXuatHangAm.Checked ? DuocPhepXuatHangAmHayKhong.DuocPhep : DuocPhepXuatHangAmHayKhong.KhongDuocPhep;
                Config.DuocPhepChiTienAm = radioButtonDuocPhepChiTienAm.Checked ? DuocPhepChiTienAmHayKhong.DuocPhep : DuocPhepChiTienAmHayKhong.KhongDuocPhep;
                Config.DuocPhepSuaMaHangKhiDaGiaoDich = radioButtonDuocPhepSuaMaHangKhiDaGiaoDich.Checked ? DuocPhepSuaMaHangKhiDaGiaoDichHayKhong.DuocPhep : DuocPhepSuaMaHangKhiDaGiaoDichHayKhong.KhongDuocPhep;
                Config.DuocLuuHDBLKhiKhahDuaThieuTien = radioButtonDuocLuuBanLeKhiTienKhachDuaChuaDu.Checked ? DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.DuocPhep : DuocLuuHDBLKhiKhahDuaThieuTienHayKhong.KhongDuocPhep;
                Config.SoNgayDuocPhepSuaHoaDon = Convert.ToInt32(numericTexBoxSuaHoaDonTrongVong.Text.Trim().ToString());
                Config.NgayKhoaSuaHĐThangTruoc = Convert.ToInt32(nmrNgayKhoaHoaDon.Text.Trim().ToString());
                Config.DuocPhepSuaNgayHoaDon = radioButtonDuocSuaNgayHoaDon.Checked ? DuocPhepSuaNgayHoaDonHayKhong.DuocPhep : DuocPhepSuaNgayHoaDonHayKhong.KhongDuocPhep;
                Config.DuocPhepSuaDanhMuc = rdoDuocSuaDanhMuc.Checked ? DuocPhepSuaDanhMucHayKhong.DuocPhep : DuocPhepSuaDanhMucHayKhong.KhongDuocPhep;
                //Config.Instance["DuocPhepSuaNgayHoaDon"] = radioButtonDuocSuaNgayHoaDon.Checked ? "1" : "0";
                Config.SuDungSearchWithNumberChoCombo = rdoAllowSearchWithNumber.Checked ? SuDungSearchWithNumberChoCombo.DuocPhep : SuDungSearchWithNumberChoCombo.KhongDuocPhep;
                Config.DuocSuaHĐThanhToanTienMat = rdoChoPhepSuaHĐTienMat.Checked ? DuocPhepSuaHoaDonThanhToanTienMatHayKhong.DuocPhep : DuocPhepSuaHoaDonThanhToanTienMatHayKhong.KhongDuocPhep;
                Config.DuocPhepTaoHangMoiBanLe = rdoAllowTaoHangTuBanLe.Checked ? DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.DuocPhep : DuocPhepTaoMoiHangHoaTrongManHinhBanLeHayKhong.KhongDuocPhep;

                Config.LinkAutoUpdate = txtLinkAutoUpdate.Text.Trim();
                
                NhatKySuDung.Insert2DB("Có vào thay đổi cấu hình thông số mặc định", "");
                this.Close();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        public void AutoUpdateAllNhoTheoKhachHangToDB()
        {
            //Dùng để tự động cập nhật lại bảng nhớ giá theo hóa đơn gần nhât cho cả bảng nhớ giá.
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = new SqlDataAdapter();

                BasicForms.FrmProgressBarDev.StartShowProgress();

                //Lấy tất các cặp đối tượng và hàng hóa (không trùng nhau) đã mua bán
                cmd.CommandText = string.Format("SELECT DISTINCT A.DoiTuongNghiepVu1ID , C.VatTuHangHoa1ID \n" +
                                                "FROM ChungTu A INNER JOIN ChungTu B ON A.ChungTuID = B.ChungTuGocID \n" +
                                                "	 INNER JOIN KhoanMucChungTu C ON C.ChungTuID = B.ChungTuID \n" +
                                                "	 INNER JOIN LoaiChungTu LCT ON A.LoaiChungTuID = LCT.ID \n" +
                                                "WHERE	LCT.Ma IN ('HoaDonBanHang','HoaDonMuaHang') "
                                                );
                DataTable dt = new DataTable();
                da.SelectCommand = cmd;
                da.Fill(dt);
                int index = 1;
                foreach (DataRow row in dt.Rows)
                {
                    BasicForms.FrmProgressBarDev.Status = string.Format("Đã xừ lý {0}/{1}", index, dt.Rows.Count);
                    DanhMucNhoGiaMuaBanNhapXuat.Instance.AutoUpdateTheoLichSuMuaBan((Guid)row["DoiTuongNghiepVu1ID"], (Guid)row["VatTuHangHoa1ID"]);
                    index++;
                }
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new CustomException("Lỗi:" + ex.ToString());
                }
            }
            finally
            {
                con.Close();
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
        }

        public void UpdateNhoGiaMuaBanNhapXuatByDoiSo(int doiSoNhoGiaMuaBanNhapXuat)
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = new SqlDataAdapter();

                BasicForms.FrmProgressBarDev.StartShowProgress();

                //Lấy tất các cặp đối tượng và hàng hóa (không trùng nhau) đã mua bán
                cmd.CommandText = string.Format("UPDATE LoaiChungTu SET NhoGiaMuaBanNhapXuat = {0}", doiSoNhoGiaMuaBanNhapXuat);
                DataTable dt = new DataTable();
                da.SelectCommand = cmd;
                da.Fill(dt);
                int index = 1;
                foreach (DataRow row in dt.Rows)
                {
                    BasicForms.FrmProgressBarDev.Status = string.Format("Đã xừ lý {0}/{1}", index, dt.Rows.Count);
                    DanhMucNhoGiaMuaBanNhapXuat.Instance.AutoUpdateTheoLichSuMuaBan((Guid)row["DoiTuongNghiepVu1ID"], (Guid)row["VatTuHangHoa1ID"]);
                    index++;
                }
            }
            catch (Exception ex)
            {
                if (ex is CustomException) throw ex;
                else
                {
                    throw new CustomException("Lỗi:" + ex.ToString());
                }
            }
            finally
            {
                con.Close();
                BasicForms.FrmProgressBarDev.FinishShowProgress();
            }
        }

        private void btnReUpdateAllNhoGia_Click(object sender, EventArgs e)
        {
            try
            {
                AutoUpdateAllNhoTheoKhachHangToDB();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            finally
            {
            }
        }

        private void cmbCachTinhGiaMuaBanBuon_EditValueChanged(object sender, EventArgs e)
        {
            if (cmbCachTinhGiaMuaBanBuon.EditValue == "Nhớ theo khách hàng") btnReUpdateAllNhoGia.Visible = true;
            else btnReUpdateAllNhoGia.Visible = false;

            if (cmbCachTinhGiaMuaBanBuon.EditValue == "Lấy trực tiếp từ danh mục") //Nếu k cần nhớ giá --> Set NhoGiaMuaBanNhapXuat ở bảng LoaiChungTu = 0 để khỏi sinh bản ghi
                UpdateNhoGiaMuaBanNhapXuatByDoiSo(0);  // K nhớ giá
            else //Các trường hợp còn lại có nhớ
                UpdateNhoGiaMuaBanNhapXuatByDoiSo(1);  // Có nhớ giá
        }
    }
}
